/**
 * @BitmapPlayerDir.as
 *
 * @author sodaChen mail:asframe@qq.com
 * @version 1.0
 * <br>Copyright (C), 2013 asFrame.com
 * <br>This program is protected by copyright laws.
 * <br>Program Name:DragonBall
 * <br>Date:2017-1-11
 */
package com.asframe.display.bmp
{
	import com.asframe.collections.maps.HashMap;
	import com.asframe.display.data.DirMovieData;
	import com.asframe.display.data.MovieData;
	import com.asframe.lang.Assert;

	/**
	 * 具备方向性的图片动画播放机制，通过指定不同的标签名字来播放不同的特效
	 * 相当多个BitmapPlayer放到map里面，然后进行播放。
	 * 这里用继承，主要是为了少一层调用，直接设置BitmapPlayer的属性
	 * @author sodaChen
	 * Date:2017-1-11
	 */
	public class BitmapPlayerDir extends BitmapPlayer
	{
		/** 方向 **/
		public var dir						:int = -1;
		/** 当前正在播放的标签名称 **/
		public var currentLabel				:String;
		/** 下一帧要播放的标签名称 **/
		public var nextLabel				:String;

		/** 动画整体数据(无法修改，所有角色共享的) **/
		protected var dirMovieData			:DirMovieData;
		/** 多方向的帧动画数据列表 **/
		protected var mDirFrames			:Vector.<MovieData>;
		protected var mLabelMap			:HashMap;

		public function BitmapPlayerDir()
		{
			super();
		}
		public function setDirMovieData(dirMovieData:DirMovieData):void
		{
			this.dirMovieData = dirMovieData;
			mLabelMap = dirMovieData.labelMap;
			currentLabel = null;
			//目前只是纯播放
		}
		public function getDirMovieData():DirMovieData
		{
			return dirMovieData;
		}
		/**
		 * 添加一个新的标签内容
		 * @param label 内容标签符号
		 * @param dirFrames 一系列方向的帧数据数组
		 *
		 */
		public function addFramebel(label:String,dirFrames:Vector.<MovieData>):void
		{
			//原来已经有了
			if(mLabelMap.hasKey(label))
			{
				throw new Error(label + "已经存在帧数据了");
			}
			mLabelMap.put(label,dirFrames);
			if(movieData == null)
			{
				//设置默认值
				if(dir == -1)
					changeLabel(label,0);
				else
					changeLabel(label,dir);
			}
		}
		/**
		 * 删除指定的动画内容
		 * @param label
		 * @return
		 *
		 */
		public function removeFrameLabel(label:String):Vector.<Vector.<MovieData>>
		{
			return mLabelMap.remove(label);
		}
		/**
		 * 是否有指定的标签动作
		 * @param label
		 * @return
		 *
		 */
		public function hasLabel(label:String):Boolean
		{
			return mLabelMap.hasKey(label);
		}
		/**
		 * 设置状态,每次切换方向时都必须调用该方法,方向值必须是ScrollBitmap提供的静态属性值
		 * @param	currWay:当前方向值
		 */
		public function changeDir(dir:int):void
		{
			//排除相同方向
			if(this.dir == dir && dir != -1)
			{
				return ;
			}
			//当dir不等于-1的时候，才需要重新设置dir，否则保持原来的方向
			if(dir != -1)
				this.dir = dir;
			if(this.dir == -1)
				this.dir = 0;

			if(mDirFrames == null)
				return ;

			movieData = mDirFrames[this.dir];
			mBitmapDatas = movieData.bitmapDatas;
			mFrames = movieData.frameDatas;

			mEnd = mBitmapDatas.length;
			//如果外界设置scaleX，也会出现问题了(主要是设置反转效果的)
			scaleX = movieData.scale;
			mStart = 0;
			if(mCurrentFrame >= mBitmapDatas.length)
				mCurrentFrame = 0;


			render();
		}
		/**
		 * 改变动画播放的内容
		 * @param label 内容标签符号
		 * @param dir 方向
		 *
		 */
		public function changeLabel(label:String,dir:int = -1):void
		{
			//这里有可能会出现问题，比如本身设置相同的label，目的是为了重置start的指数
			if(label == null || currentLabel == label)
			{
				return ;
			}

			this.currentLabel = label;
			mDirFrames = mLabelMap.get(label);
			//对方向进行归0
			this.dir = -1;
			Assert.notNull(mDirFrames,label + "出现方向帧数据为空");
			changeDir(dir);
		}
		/**
		 * 播放Bitmap动画.注意，当设定循环时，不能设置回调函数和nextLabel的参数
		 * @param isLoop 是否循环播放
		 * @param callBack 结束帧数时回调函数
		 * @param label 指定播放的内容，为空则继续播放当前的内容
		 * @param nextLabel label播放完之后自动播放另外nextLabel
		 *
		 */
		public function playLabel(label:String = null,
								  dir:int = -1,
								  isLoop:Boolean = true,
								  playComplete:Function = null,
								  nextLabel:String = null):void
		{
			if(isLoop && playComplete != null)
				throw new Error("不能循环的时候具备playComplete参数");

			if(isLoop && nextLabel != null)
				throw new Error("不能循环的时候具备nextLabel");


			//从0开始算
			if(label != null)
			{
				changeLabel(label,dir);
			}
			if(playComplete != null)
			{
				this.playComplete = playComplete;
			}
			this.isLoop = isLoop;
			this.nextLabel = nextLabel;

			play();
			render();
		}
	}
}